﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MontagsmalerApp
{
	/// <summary>
	/// Repräsentiert eine Gruppe von Einzelspielern.
	/// </summary>
	[Serializable]
	public class Spielerteam : Spielteilnehmer
	{
		/// <summary>
		/// Punkte für das Team, die keinem Spieler direkt zugeordnet sind.
		/// </summary>
		private int teamPunkte = 0;

		/// <summary>
		/// Erstellt eine neue Instanz eines Spielerteams mit dem angegbenen Namen.
		/// </summary>
		/// <param name="name"></param>
		public Spielerteam(string name)
			: base(name)
		{
			Einzelspieler = new List<Einzelspieler>();
		}

		/// <summary>
		/// Eine Liste mit den Mitgliedern des Teams.
		/// </summary>
		public IList<Einzelspieler> Einzelspieler { get; set; }

		/// <summary>
		/// Entfernt den angegebenen Spieler aus diesem Team, wenn er vorhanden ist.
		/// </summary>
		/// <param name="name"></param>
		public void EntferneSpieler(string name)
		{
			Einzelspieler spielerToRemove = null;
			foreach (var currentSpieler in Einzelspieler)
			{
				if (currentSpieler.Name == name)
					spielerToRemove = currentSpieler;
			}

			if (spielerToRemove != null)
				Einzelspieler.Remove(spielerToRemove);
		}

		/// <summary>
		/// Entfernt den angegebenen Spieler aus diesem Team, wenn er vorhanden ist.
		/// </summary>
		/// <param name="name"></param>
		public void EntferneSpieler(Einzelspieler spieler)
		{
			if (HasSpieler(spieler))
				Einzelspieler.Remove(spieler);
		}

		/// <summary>
		/// Fügt diesem Team einen Spieler hinzu (sollte er nicht schon vorhanden sein.
		/// </summary>
		/// <param name="spieler"></param>
		public void AddSpieler(Einzelspieler spieler)
		{
			// Spielverwaltung prüft vorher, ob der Spieler auch hinzugefügt werden kann.
			if (!HasSpieler(spieler))
				Einzelspieler.Add(spieler);
		}

		/// <summary>
		/// Gibt die Gesamtpunktzahl des Teams zurück.
		/// </summary>
		/// <returns></returns>
		public override int GetAktuellePunkte()
		{
			int spielerPunkte = 0;
			foreach (var spieler in Einzelspieler)
				spielerPunkte += spieler.GetAktuellePunkte();

			return spielerPunkte + teamPunkte;
		}

		/// <summary>
		/// Gibt zurück, ob der angegebene Spieler in diesem Team enthalten ist.
		/// </summary>
		/// <param name="spieler"></param>
		/// <returns></returns>
		public bool HasSpieler(Einzelspieler spieler)
		{
			return Einzelspieler.Contains(spieler);
		}

		/// <summary>
		/// Setzt die Punkte aller Spieler auf 0 zurück.
		/// </summary>
		public override void PunkteZuruecksetzen()
		{
			foreach (var spieler in Einzelspieler)
				spieler.PunkteZuruecksetzen();
		}

		/// <summary>
		/// Zwei Spielerteams sind gleich, wenn sie den gleichen Namen tragen.
		/// </summary>
		/// <param name="obj"></param>
		/// <returns></returns>
		public override bool Equals(object obj)
		{
			Spielerteam other = obj as Spielerteam;

			if ((object)other == null)
			{
				return false;
			}

			return other.Name.ToLower() == this.Name.ToLower();
		}

		public override int GetHashCode()
		{
			return GetType().GetHashCode() + Name.GetHashCode();
		}

		/// <summary>
		///  Addiert die angegebene Punktzahl zu den bisherigen Punkten dazu.
		/// </summary>
		/// <param name="neuePunktzahl"></param>
		public override void AddierePunkte(int neuePunktzahl)
		{
			teamPunkte += neuePunktzahl;

      OnPropertyChanged("NamePunkte");
		}
	}
}

